package com.lbs;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import java.util.Map;

import javax.xml.ws.BindingProvider;

import com.itextpdf.text.BadElementException;
import com.lbs.webservices.lizbet.timbrado.LbsWsTimbrado;
import com.lbs.webservices.lizbet.timbrado.LbsWsTimbradoService;
import com.lizbet.server.XmlFact;
import com.lizbet.server.myXmlParsingException;

/**
 * Representa un documento tipo CFD
 * 
 * @author Alberto Sandoval Sotelo Martes 28/Agosto/2012
 *
 */
public class CFDI extends LbsDocumento {

	
	public CFDI() {
		tipoCfd.add("nombre", "CFDI");
		tipoCfd.add("leyenda", "Este documento es una representacion impresa de un CFDI.");
		pathPlantilla="plantillaCFDI.xml";
		pathBgImage="bgCFDI.png";
	}

	/**
	 * Timbra el documento.
	 * 
	 * @param Contraseña
	 * @throws LbsException 
	 * @throws IOException 
	 * @throws MalformedURLException 
	 * @throws BadElementException 
	 */
	public void timbrar(String contrasena) throws LbsException, BadElementException, MalformedURLException, IOException{
		LbsWsTimbrado wsTimbrado=null;
		try {
			wsTimbrado = (new LbsWsTimbradoService()).getLbsWsTimbradoPort();
		}catch (Exception e){
			throw new LbsException("Imposible conectar con el servidor. Verifique su conexion a internet.");
		}
		//TimeOut increment
		Map<String, Object> requestContext = ((BindingProvider)wsTimbrado).getRequestContext();
		requestContext.put("com.sun.xml.ws.request.timeout", 60000); // Timeout in millis
		requestContext.put("com.sun.xml.ws.connect.timeout", 60000);
		requestContext.put("com.sun.xml.internal.ws.request.timeout", 60000); // Timeout in millis
		requestContext.put("com.sun.xml.internal.ws.connect.timeout", 60000);

		byte[] result = wsTimbrado.timbrar(xml.toString().getBytes("UTF8"), contrasena);
		if (new String(result).startsWith("Error"))
			throw new LbsException(new String(result));
		
		try {
			xml = new XmlFact(result);
			buildPdf();
		} catch (myXmlParsingException e) {
			throw new LbsException("Error procesando respuesta.");
		}
	}
	
	/**
	 * Permite cancelar una lista de documentos CFDI. Por su UUID
	 * 
	 * @param rfc
	 * @param contrasena
	 * @param uuids
	 * @param pfx
	 * @param pfxContrasena
	 * @throws LbsException
	 */
	public static void cancelar(String rfc, String contrasena, List<String> uuids, byte[] pfx, String pfxContrasena) throws LbsException{
		LbsWsTimbrado wsTimbrado=null;
		try {
			wsTimbrado = (new LbsWsTimbradoService()).getLbsWsTimbradoPort();
		}catch (Exception e){
			throw new LbsException("Imposible conectar con el servidor. Verifique su conexion a internet.");
		}
		
		//TimeOut increment
		Map<String, Object> requestContext = ((BindingProvider)wsTimbrado).getRequestContext();
		requestContext.put("com.sun.xml.ws.request.timeout", 60000); // Timeout in millis
		requestContext.put("com.sun.xml.ws.connect.timeout", 60000);
		requestContext.put("com.sun.xml.internal.ws.request.timeout", 60000); // Timeout in millis
		requestContext.put("com.sun.xml.internal.ws.connect.timeout", 60000);

		String result=wsTimbrado.cancelar(contrasena, rfc, uuids, pfx, pfxContrasena);
		if (!result.equals("ok"))
			throw new LbsException(result);
	}
	
	
	public String getUuid(){
		if (xml==null)
			throw new RuntimeException("Debe sellar y timbrar para poder obtener este dato");
		
		return xml.get("Complemento/tfd:TimbreFiscalDigital/UUID");
	}
	
	public String getCertificadoSat(){
		if (xml==null)
			throw new RuntimeException("Debe sellar y timbrar para poder obtener este dato");
		
		return xml.get("Complemento/tfd:TimbreFiscalDigital/UUID");
	}
	
	public String getSelloSat(){
		if (xml==null)
			throw new RuntimeException("Debe sellar y timbrar para poder obtener este dato");
		
		return xml.get("Complemento/tfd:TimbreFiscalDigital/selloSAT");
	}
	
	public String getCadenaTimbret(){
		if (xml==null)
			throw new RuntimeException("Debe sellar y timbrar para poder obtener este dato");
		
		return xml.getCadenaTimbre();
	}
}
